import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.Key;
import java.util.Scanner;

//Java的javax.crypto包来实现AES加密和解密
public class AESExample {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        try {
            System.out.println("请输入需要加密的明文：");
            String plaintext = scanner.nextLine();
            String key = "0123456789abcdef";
            //们使用 encrypt 函数将明文加密为密文，并用 Base64 编码输出
            byte[] encryptedText = encrypt(plaintext, key);
            System.out.println("加密文本 (Base64): " + base64Encode(encryptedText));
            //Base64是一种二进制到文本的编码方式如果要更具体一点的话，
            //可以认为它是一种将 byte数组编码为字符串的方法，
            // 而且编码出的字符串只包含ASCII基础字符
            System.out.println();
            String decryptedText = decrypt(encryptedText, key);
            System.out.println("解密文本: " + decryptedText);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public static byte[] encrypt(String plaintext, String key) throws Exception {
        //在 encrypt 函数中，我们首先创建一个 SecretKeySpec 对象，
        //将密钥（以字节数组形式)和AES算法名称传递给它。
        Key aesKey = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), "AES");
        //然后，我们使用 Cipher.getInstance("AES")获取一个AES加密实例。
        Cipher cipher = Cipher.getInstance("AES");
        //接下来，我们使用 cipher.init(Cipher.ENCRYPT_MODE, aesKey)初始化加密模式和密钥。
        cipher.init(Cipher.ENCRYPT_MODE, aesKey);
        //最后，我们使用 cipher.doFinal(plaintext.getBytes(StandardCharsets.UTF_8))
        // 对明文进行加密并返回加密后的字节数组
        return cipher.doFinal(plaintext.getBytes(StandardCharsets.UTF_8));
    }

    public static String decrypt(byte[] ciphertext, String key) throws Exception {
        //我们创建一个 SecretKeySpec 对象，将密钥和 AES 算法名称传递给它。
        Key aesKey = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), "AES");
        //我们使用 Cipher.getInstance("AES") 获取一个 AES 解密实例
        Cipher cipher = Cipher.getInstance("AES");
        //使用 cipher.init(Cipher.DECRYPT_MODE, aesKey) 初始化解密模式和密钥
        cipher.init(Cipher.DECRYPT_MODE, aesKey);
        //使用 cipher.doFinal(ciphertext) 对密文进行解密，得到解密后的字节数组，并将其转换为字符串返回
        byte[] decryptedBytes = cipher.doFinal(ciphertext);
        return new String(decryptedBytes, StandardCharsets.UTF_8);
    }
    //使用了 Java 8 的 java.util.Base64 类来进行编码和解码操作。
    //编码
    public static String base64Encode(byte[] bytes) {
        return java.util.Base64.getEncoder().encodeToString(bytes);
    }
    //解码
    public static byte[] base64Decode(String base64) {
        return java.util.Base64.getDecoder().decode(base64);
    }
}

